package com.adtech.export.coverters;

import java.util.HashMap;
import java.util.Map;

import com.adtech.export.coverters.impl.ChBooleanDefaultConverter;

/**
 * 属性转换器bean
 * @author Puzhijun
 * */
public class PropertyConverterBean {
	/** 单例 */
	private static PropertyConverterBean instance = new PropertyConverterBean();
	
	private Map<Class<?>, PropertyConverter<?>> propertiesMap;
	
	private PropertyConverterBean(){
		propertiesMap = new HashMap<Class<?>, PropertyConverter<?>>();
		propertiesMap.put(Boolean.class, new ChBooleanDefaultConverter());
	}
	
	public static PropertyConverterBean getInstance() {
		return instance;
	}
	
	/**
	 * 注册一个类型转换器
	 * @param clazz 类型Class
	 * @param converter 转换器
	 * @return PropertyConverter
	 */
	@SuppressWarnings("unchecked")
	public <T> PropertyConverter<T> registerConverter(Class<T> clazz, PropertyConverter<T> converter) {
		return (PropertyConverter<T>) propertiesMap.put(clazz, converter);
	}
	
	/**
	 * 注销一个类型转换器
	 * @param clazz 要注销的类型
	 * @return PropertyConverter
	 */
	public <T> PropertyConverter<T> unRegisterConverter(Class<T> clazz) {
		@SuppressWarnings("unchecked") //safe
		PropertyConverter<T> converter = (PropertyConverter<T>) propertiesMap.get(clazz); 
		if(converter != null) propertiesMap.remove(clazz);
		return converter;
	}
	
	/**
	 * 注销所有的类型转换器
	 */
	public void unRegisterAllConverters() {
		propertiesMap = new HashMap<Class<?>, PropertyConverter<?>>();
	}
	
	/**
	 * 转换值
	 * @param clazz 类型
	 * @param value 值
	 * @return 返回已经转换了的值
	 */
	public <T> Object converter(Class<T> clazz, Object value) {
		@SuppressWarnings("unchecked") //safe
		PropertyConverter<T> converter = (PropertyConverter<T>) propertiesMap.get(clazz);
		if(converter != null) {
			return converter.convert(value, clazz);
		}
		return value;
	}
}
